﻿#ifndef TASKMANAGERSERVER_H
#define TASKMANAGERSERVER_H

#include <QObject>
#include "taskmanager.h"
#include "Modbus/modbusmanage.h"

class taskManagerServer : public QObject
{
    Q_OBJECT
public:
    explicit taskManagerServer(QObject *parent = nullptr);

    //////////////////////////////////////////////////
    /// *函数名称:
    /// 函数功能: 初始化基本参数信息
    /// 函数参数:
    /// 返回值:
    /// */
    void taskManagerServerInit();

    //////////////////////////////////////////////////
    /// *函数名称:
    /// 函数功能: 实时判断任务状态 及处理
    /// 函数参数:
    /// 返回值:
    bool taskProcessTimer();

    //////////////////////////////////////////////////
    /// *函数名称:
    /// 函数功能: 实时判断ESS 接口返回数据
    /// 函数参数:
    /// 返回值:
    bool ProcessMsgRecv();


    //////////////////////////////////////////////////
    /// *函数名称: 实时检测是否满足创建SAP任务
    /// 函数功能:
    /// 函数参数:
    /// 返回值:
    /// */

    bool ProcessCodeSAPExcelInfo();

    //////////////////////////////////////////////////
    /// *函数名称:  getcurrentSAPExcelInfoTask
    /// 函数功能:   定时获取数据库，待执行任务 任务状态为:0
    /// 函数参数:   无参数
    /// 返回值:
    bool getcurrentSAPExcelInfoTask(QString taskType);

    //////////////////////////////////////////////////
    /// *函数名称:   deleteTextFilesOlderThan
    /// 函数功能: 判断过期日期删除指定文件夹日志文件
    /// 函数参数: folderPath-文件夹路径
    /// 函数参数: days-删除阈值，多少天后
    /// 返回值:
    void deleteTextFilesOlderThan(QString folderPath, int days);

    int getCurrentWorkStation(SAPExcelInfo SAPExcelInfoI);

    int getCurrentStation(SAPExcelInfo SAPExcelInfoI,int loadPoint,int unloadPoint,int agvId_,QString taskType);                  //获取空闲AGV小车

    bool setSAPCodeStatus(SAPExcelInfo SAPExcelInfoI);                              //设置工位任务绑定与解绑

     //设置工位车架锁定与解锁 Action:0 彻底初始化  1锁定  2仅改变车架编码与车架状态
    bool setCodeStatusLock(QString deviceDesc,int SAPTaskIndex,int CarCode,int CarStauts,int Action);

    int getCurrentAGVControl(int AGVId);                                   //获取当前 AGV 节点对应的站点信息

    /********************************** 广州蔡司CR开模3线 ***********************************/
    int GetFreeAGV(QString agv1, QString agv2, QString agv3);//查询相应空闲 AGV

    void returnStopStation();//AGV返回待机点判断

    QString GetStation(QString Station, int stationStatus, QString scanCode);//获取库位状态

    bool PLC_Read(QString Station, QString coil);//获取 PLC 指定线圈状态

    void PLC_Write(QString Station, QString coil, int value);//写入 PLC 指定线圈状态

    void StationStatus_Reset(SAPExcelInfo seletSAPExcelInfoI);// 任务库位状态PLC复位

    void StationTimeUpdate();// 实时更新工位状态

    void TaskTimeCreate();// 实时判断创建任务

signals:

    /************* 发布AGV任务 ************/
    void sigAGVMoveTask(QString AGVIP, quint32 StartQRPoint, quint32 EndQRPoint, int AGVAction,int chargetye,agvORderTask agvORderTaskI);

    /************* AGV 打开/关闭 充电指令 ************/
    void sigChargeTask(QString AGVIP,  quint16 opendcharge);

    /************* 根据任务状态实时 绑定解绑接驳台 ************/
    void sigDeviceStatus(QString deviceDesc,SAPExcelInfo SAPExcelInfoI);

    /************* 状态更新 显示 ************/
    void sigAGVCurrentTaskMap(QMap<QString,AGVCurrentTask>AGVCurrentTaskMapI,bool BatteryLevel);

    //MES 主动提交暂存位以及装机位状态信息
    void sig_CodeStatus(QMap<int,CodeStatus>CodeStatusMap);

    /************************** 广州蔡司HCAR5线 ***************************/
    void sig_MoubusWriteCoil_QR(int address, quint16 value);    // 指定Modbus线圈写入指定值

    void sig_MoubusWriteCoil_QC(int address, quint16 value);    // 指定Modbus线圈写入指定值

    void sig_MoubusWriteCoil_RS(int address, quint16 value);    // 指定Modbus线圈写入指定值

    void sig_MoubusWriteCoil_RX(int address, quint16 value);    // 指定Modbus线圈写入指定值

    void sig_MoubusWriteCoil_Client(int address, quint16 value);    // 指定Modbus线圈写入指定值

    void sig_TextDisplay(QString Text);//提示文本描述显示

    void sig_AgvTaskBool(int TaskBool);//AGV任务启动状态

public slots:
     //实时判断任务状态 及处理
     void taskManagerServerTimer();

     //实时判断任务状态 及处理
     void taskManagerServerTimer_();

     // 广州蔡司CR开模3线 实时判断任务状态 及处理
     void taskManagerServerTimer_CR3();

     //创建 SAP 任务
     void ON_SAPExcelInfo_new(SAPExcelInfo SAPExcelInfoI);

     //创建 AGV 搬运任务
     void ON_AGVMoveTask(QString AGVIP,QString taskType,AGVCurrentTask AGVCurrentTaskI);

     //AGV 状态信息
     void ON_AgvStateWidget(agvState agvStateItemI);

     //激光AGV状态信息
     void ON_AGVStatusWidget(QMap<QString,AGVStatus>AGVStatusMap_,QMap<QString,AGVTaskStatus>AGVTaskStatusMap_);

     //更新SAP 任务状态
     void ON_UPSAPExcelInfoTask(SAPExcelInfo seletSAPExcelInfoI);

     //AGV任务启动状态
     void ON_AgvTaskBool(int TaskBool);

     //手动更新AGV当前动作指令状态
     void ON_AGVCurrentTaskAction(QString AGVIP,QString Type, int Action);

     //删除 SAP 任务
     void ON_deleteSAPExcelInfoTask(SAPExcelInfo seletSAPExcelInfoI);

     /************************** 广州蔡司CR开模3线 ***************************/
     // PLC监控触发 Modbus 写入
     void ON_WriteModbusII(int address, quint16 value);

     // 更新库位记录，写入数据库
     void ON_StationStatusUpdate(StationStatusUpdate StationStatusUpdateI);

     // 库位显示界面 更新库位状态
     void UpdateStation_Show(QString Station, int stationStatus, QString scanCode);

     // 任务逻辑 更新库位状态
     void UpdateStation(QString Station, int stationStatus, QString scanCode);

public:
     bool countbool=true;
     int taskAgvNum=0;                                       //0 自动分配
     int agvTaskBool=0;                                      //AGV任务启动状态--: 0启动  1暂停
     int taskMode=0;                                         //任务模式
     int currentAgvCount=0;                                  //当前正常可用AGV数量

     int TableWidgetcount=0;
     int TableWidgetcount_=0;
     int TableWidgetcount_HR=0;
     QString currentUserNuber="";

     CodeStatus CodeStatusIN;
     CodeStatus CodeStatusOUT;
     QMap<int,CodeStatus>CodeStatusMap;                     //MES 的所有位置状态
     QMap<QString,deviceI>currentStationInfoMap;            //当前站点状态信息

     bool boolagvState=true;                                //槽函数 保护机制
     bool BatteryLevel=true;
     QMap<QString,AGVTaskStatus>AGVTaskStatusMap;
     QMap<QString,AGVCurrentTask>AGVCurrentTaskMap;        //当前AGV状态信息

     int CodeStatus_int=0;                                  //下一个准备出料的agvId
     int CodeStatus_next=0;                                 //下一个准备出料的老化位
     int StationEmtpy_IN=0;                                 //入料端: 返空车 与入料 交叉运行
     int StationEmtpy_OUT=0;                                //出料端: 返空车 与出料 交叉运行

     int SAPTaskIndex_IN=0;
     int SAPTaskIndex_OUT=0;
     bool SAPTaskIndex_boolOUT=false;                       //true 代表已有小车前往下机位 取空车架 可提前触发 出料任务
     QMap<int,int>taskAgvNumMap;                            //一次只能指定一个AGV任务

     /**
      * 赖俊龙
      * 新建一次 AGV 任务只能唯一一个起始位判断容器
      */
     QMap<int,QString>taskLoadMap;                          //一次只能唯一一个起始位

     QMap<QString, SAPExcelInfo>newSAPExcelInfoList;        //new MES task
     QMap<int, SAPExcelInfo>currentSAPExcelInfoTask;        //MES run task
     QMap<int, SAPExcelInfo>slectSAPExcelInfoTask;          //new sql task
     QMap<QString, SAPExcelInfo>cancelSAPExcelInfoTask;     //取消AGV任务列表 通知 RCS  RCS返回后不再触发

     /*********** 广州蔡司CR开模3线 **********/
     ModbusAll ModbusAllData;                               // Modbus 状态信息

     QDateTime agv1Time;                                    // 1号AGV空闲计时
     QDateTime nullTime;                                    // 计时空值
     int agv1Times=-1;                                      // 1号AGV空闲计时差 S

     QDateTime ONE_Time;                                    // 清洗流程 下发任务反馈超时计时
     QDateTime TWO_Time;                                    // 转运流程 下发任务反馈超时计时
     QDateTime THREE_Time;                                  // 出篮流程 下发任务反馈超时计时
     QDateTime OUT_Time;                                    // 取料超时 下发取料超时计时
     QDateTime Music_Time;                                  // 语音提醒超时 下发语音提醒超时计时

     QMap<int, int>StopStation;                             // 待机点站点号
     QMap<QString, int>PLCWrite;                            // PLC 线圈写入地址
     QMap<QString, QString>StationWrite;                    // 对接工位等待站点写入

     QMap<int, int>AGVStationMap;                           // 获取AGV状态 0：空闲 1：已分配任务

private:
     QTimer *StTimer;
     QTimer *StTimer_;

     QTimer *StTimer_CR3;                // 蔡司CR开模3线定时器对象

     ServerInit ServerInitItem;      //基础信息
     ServerItem CurrentServerItem;   //需要实时更信息 链表表 整合

     ThreadInsert *ThreadInsertI;
     QThread *ThreadInsertItiem;

     threadQuery *threadQueryI;
     QThread *threadQueryItem;

     /***************** 广州蔡司CR开模3线 *******************/
     ModbusManage *ModbusManageI;
     QThread *ModbusManageItem;

     int HttpPort=0;
     QDateTime HttpOnLineTimer;
     QList<HttpServer *>serverlist;

     QMutex mutex;                                               // 互斥锁对象

     SAPExcelInfo _resetSAPExcelInfoI;                          // PLC按钮盒信号复位

};

#endif // TASKMANAGERSERVER_H
